import Vue from 'vue'
import VueRouter from 'vue-router'
// 导入组件路径
import login from '../views/user/login.vue'
// 导入二级路由
import layout from '../views/layout.vue'
// 导入二级组件
import home from '../views/home/home.vue'
import movie from '../views/movie/movie.vue'
import qa from '../views/qa/qa.vue'
import user from '../views/user/user.vue'
// 导入404 页面组件
import notfound from '../views/notfound/notfound.vue'
// 导入编辑页面组件
import edit from '../views/user/edit.vue'


Vue.use(VueRouter)

// 配置路由
// router是 一级路由 , 是app.vue的路由出口
// children 是二级路由 , 是底部栏组件的 路由出口

// 重定向 , 直接从 / ,跳转指定页面 , 需得同级跳转
const routes = [
  {
    name: 'login',
    path: '/login',
    component: login,
  },
  {
    name: 'edit',
    path: '/edit',
    component: edit,
  },
  {
    name: 'layout',
    path: '/',              // 路径为 / , 则默认跳转这个页面 , 如果都没有给 / , 则跳到 app.vue 里面
    component: layout,
    children: [
      {
        path: '/home',
        component: home,
      },
      {
        name: 'movie',
        path: '/movie',
        component: movie,
      },
      {
        name: 'qa',
        path: '/qa',
        component: qa,
      },
      {
        name: 'user',
        path: '/user',
        component: user,
        // meta:{isLogin:true}
      },
      {
        path: '/',
        redirect:'/home'
      }
    ]
  },
  {
    path: '/notfound',
    component:notfound
  },
  {
    path: '*',
    redirect:'/notfound'
  }
]


/* 去掉路由跳转reject异常提示
注意：我们是直接修改VueRouter的原型，所以需要在实例化之前调用
*/
//(1)先保存路由原型链中默认的跳转函数
const originalPush = VueRouter.prototype.push
//(2)替换原型链中的push
VueRouter.prototype.push = function push (location, onResolve, onReject) {
  if (onResolve || onReject) {
    // 正常执行
    //originalPush.call() : 我们自定义的push底层还是调用默认的push
    return originalPush.call(this, location, onResolve, onReject)
  }
  //如果有异常，本来这个err默认是抛出的，我们直接不做任何处理（给吞掉了）
  /* 
  底层默认是抛出异常：err => {throw err}
  我们不抛出，不做任何处理：err => err
  */
  return originalPush.call(this, location).catch(err => err)
}


// 实例化路由对象
const router = new VueRouter({
  routes
})

// 导入tOKEN
import {getToken} from '../utils/token.js'

// 路由守卫得在实例化路由后面
router.beforeEach((to, from, next) => {
  // console.log(getToken());
  // to . 去哪里
  // from  从哪里来
  // next() 直接放行   next必须得有
  // next({path:'/home'})   不合格进来
  // next()   isLogin 为 false || token为 true ,  四种可能性选择了两种 , 有token这么都放行 , isLogin为true又无法通过判断
  // next({path:'/home'})   isLogin 为 true && token为 flase , 只选了一种可能 , 已经够了

  if (to.meta.isLogin && !getToken()) {
    next({path:'/login'})
  } else {
    next()
  }
})


export default router
